<!DOCTYPE html>
<html lang="en">

<head>
    <meta charset="UTF-8">
    <meta http-equiv="X-UA-Compatible" content="IE=edge">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>Document</title>
</head>

<body>

    <script>


        // 对象的属性或者方法的访问机制
        //    在访问一个对象的属性或者方法的时候，构造函数自己有，就直接访问自己的   结束
        //    在访问一个对象的属性或者方法的时候，构造函数自己没有，就去构造函数的prototype上去找  如果找到了就结束
        //    在访问一个对象的属性或者方法的时候，构造函数自己没有，prototype上也没有   继续上一层，也就是Object.prototype  
        //    在Object的prototype上也找不到相应的属性或者方法的时候  报错



        // prototype也是一个对象    必定也有自己的构造器   也有prototype  

        //    实际上  prototype 是由Object创建的     Object也有protype  


        function Person(name, age) {
            this.name = name;
            this.age = age;
            this.fn = function () {
                console.log(1);
            }
        }
        Person.prototype.fn = function () {
            console.log(2);
        }

        Person.prototype.say = function() {
            console.log('say');
        }

       

        const p1 = new Person('cc', 20);

        console.log(p1);

        // fn使用的是构造函数自己的
        p1.fn()    // 1


        // say使用的是  构造函数没有，prototype上有  就直接使用
        p1.say()


        // Object.prototype  上有toString
        p1.toString();   // 可以访问


        // Object.prototype  上没有aa


        // Object.prototype.aa = function() {
        //     console.log('aa');
        // }


        p1.aa()    // 报错

    </script>

</body>

</html>